﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _53String类
{
    internal class Program
    {
        //字符
        private static void Main1(string[] args)
        {
            char c1 = '你';
            char c2 = '好';

            Console.WriteLine((int)c1);
            Console.WriteLine((int)c2);
        }

        //字符串
        private static void Main2(string[] args)
        {
            string s1 = "你好";
            //可以遍历字符串拿到每一个字符,字符串本质就是字符数组
            for (int i = 0; i < s1.Length; i++)
            {
                Console.WriteLine((int)s1[i]);
            }
        }

        //String类提供的静态方法
        private static void Main3(string[] args)
        {
            string name = "张三";
            int age = 15;
            //Console.WriteLine();
            string str = string.Format("{0}今年{1:0000.000}岁", name, age);
            Console.WriteLine(str);

            float maxHp = 320;
            float hp = 101;

            Console.WriteLine("当前血量{0:p}", hp / maxHp);

            DateTime time = DateTime.Now;
            Console.WriteLine(time);
            string str1 = string.Format("{0:yyyy}年{0:MM}月{0:dd}日 {0:HH}点{0:mm}分", time);
            Console.WriteLine(str1);

            Console.WriteLine((hp / maxHp).ToString("p"));
        }

        //字符串对象的常用方法
        //注意:看似修改字符串的方法都不会真的修改字符串,而是返回一个新的字符串
        private static void Main4(string[] args)
        {
            string str = "   中国四大名著:A<<水浒传>>,B<<西游记>>,C<<三国演义>>,d<<红楼梦>>";
            // Insert();//插入
            string str1 = str.Insert(2, "的");
            Console.WriteLine(str1);

            // StartsWith();//是否以...开始
            Console.WriteLine(str.StartsWith("中国"));

            // EndsWith(); //是否以...结尾
            Console.WriteLine(str.EndsWith("红楼梦"));

            // Remove(); //移除
            string str2 = str.Remove(2, 2);
            Console.WriteLine(str2);

            // Substring();//截取
            string str3 = str.Substring(2, 2);
            Console.WriteLine(str3);

            // Replace(); //替换
            string str4 = str.Replace(',', ' ');
            Console.WriteLine(str4);

            // Split();//分割
            string[] str5 = str.Split(',', ':');
            foreach (var item in str5)
            {
                Console.WriteLine(item);
            }
            // ToLower(); //转小写
            // ToUpper();//转大写
            string str6 = str.ToLower();
            Console.WriteLine(str6);

            // Trim();//默认删除首尾空格 可以用参数指定要删除的首尾字符
            string str7 = str.Trim('中', ' ');
            Console.WriteLine(str7);
            // TrimStart();//删除首空格
            // TrimEnd();//删除尾空格

            // ToCharArray();//转字符数组
            char[] array = str.ToCharArray();
            //多次操作array中的字符粗,最后重新构造成字符串减少垃圾
            string str8 = new string(array);
        }

        //字符串的不可变性
        private static void Main5(string[] args)
        {
            //这两个变量指向同一个对象
            string name1 = "张三";
            //name1[0] = '李';  //不让改,如果可以改那么name2也会跟着姓李
            string name2 = "张三";

            //会创建一个新的字符串不使池
            string name3 = new string(new char[] { '张', '三' });

            string name4 = name3.ToString();

            //不使池,内部用了new
            string name5 = "张三李四";
            string name6 = name5.Substring(0, 2);//
            string name7 = name5.Substring(0, 2);//张三

            //string name9 = Console.ReadLine();

            string name0 = "张" + "三"; //会使用池

            Console.WriteLine(ReferenceEquals(name1, name2));
            Console.WriteLine(ReferenceEquals(name1, name3));
            Console.WriteLine(ReferenceEquals(name1, name4));
            Console.WriteLine(ReferenceEquals(name3, name4));
            Console.WriteLine(ReferenceEquals(name3, name6));
            Console.WriteLine(ReferenceEquals(name6, name7));
            Console.WriteLine(ReferenceEquals(name1, name0));

            //只要通过new构造字符串,就不会从池冲查找
        }

        //字符串转义
        private static void Main(string[] args)
        {
            Console.WriteLine(" \"你好\" ");
            Console.WriteLine(" \\");

            //制表符
            Console.WriteLine("姓名\t学号\t年龄");
            Console.WriteLine("张三\t1011\t8");
            Console.WriteLine("周杰伦\t1013\t16");
            Console.WriteLine("\a");

            //退格
            Console.WriteLine("AB\b\bCD");

            //换行
            Console.WriteLine("ABC\nDEF");

            //回车
            Console.WriteLine("XXX\rYYY");

            //@取消字符串中的转义符
            string path = @"C:\Users\UnityPC\Desktop\新建文本文档.txt";
        }
    }
}